package ThreadTest;


//wait 和 notify 都是object对象的方法，并且都要搭配 ynchronized 使用
//wait 和 notify方法 是针对同一个对象
//调用wait方法的线程就会陷入阻塞，阻塞到有其他线程通过botify来通知
public class WaitAndNotify {

    static class WaitTask implements Runnable {
        private Object WaitTasklocker;

        public WaitTask(Object WaitTasklocker) {//给 WaitTask 提供一个构造方法，且参数是一个对象
            this.WaitTasklocker = WaitTasklocker;
        }

        @Override
        public void run() {
            synchronized (WaitTasklocker) {//让 WaitTasklocker 对象wait，就必须给它上锁
                try {
                    System.out.println("wait 开始");
                    WaitTasklocker.wait();//让WaitTasklocker 进入阻塞状态，直到另一个线程notify
                    System.out.println("wait 结束");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    static class NotifyTask implements Runnable {
        private Object NotifyTasklocker;

        public NotifyTask(Object NotifyTasklocker) {
            this.NotifyTasklocker = NotifyTasklocker;
        }

        @Override
        public void run() {
            synchronized (NotifyTasklocker) {
                System.out.println("notify 开始");
                NotifyTasklocker.notify();//对WaitTasklocker发出通知，并让其重新获得对象锁
                System.out.println("notify 结束");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Object obj = new Object();//创建一个对象obj
        Thread t1 = new Thread(new WaitTask(obj));//传入obj对象
        Thread t2 = new Thread(new NotifyTask(obj));//线程中，对象都为obj
        t1.start();
        Thread.sleep(1000);
        t2.start();
    }
}
